package com.example.demo.common;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: DELL
 * Date: 2023-06-01
 * Time: 7:30
 */

/**
 * 自定义拦截器得实现
 */
@Component
public class LoginInterceptor implements HandlerInterceptor {

    /**
     * 拦截器为调用方法执行之前执行的方法
     *
     * @param request  请求
     * @param response 响应
     * @param handler  表示要执行的处理器对象, 即处理请求的 Controller 对象或者是拦截器的对象
     * @return true 拦截器验证成功, 继续执行后续操作
     * false 拦截器验证失败, 验证未通过后续流程不执行
     * @throws Exception 异常
     */
    @Autowired
    private ResultAjax resultAjax;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        // 用户登录判断
        HttpSession session = request.getSession(false);
        if (session != null && session.getAttribute("session_userinfo") != null) {
            // 该用户已经登陆
            return true;
        }

        ObjectMapper objectMapper = new ObjectMapper();

        // 设置数据返回格式
        response.setContentType("application/json; charset = utf8");

        // 当前方法未通过登陆鉴权
        resultAjax.setCode(-1); // 无论是否通过鉴权, 都需要正确返回 200 让前端能够接收数据
        resultAjax.setMsg("用户未登录, 请登录后再操作 !");
        resultAjax.setDate(""); // 为登陆没有数据返回

        // 将返回的数据对象转为 JSON 格式字符串
        String respJson = objectMapper.writeValueAsString(resultAjax);

        // 返回统一的处理对象给前端
        response.getWriter().write(respJson);
        return false;
    }
}
